package main

import (
	"fmt"
)
/*
Go 语言切片是对数组的抽象。
Go 数组的长度不可改变，在特定场景中这样的集合就不太适用，
Go中提供了一种灵活，功能强悍的内置类型切片("动态数组"),
与数组相比切片的长度是不固定的，可以追加元素，在追加时可能使切片的容量增大。
*/
func myPrint(a []int) {
	// 输出切片的长度 容量 值 类型
	fmt.Printf("len=%d cap=%d v=%v T=%T\n",len(a),cap(a),a,a)
}
func main() {
	// 定义一个切片
	var sli1 []int
	// 为这个切片赋初值
	sli1 = []int{1,2,3}
	fmt.Println(sli1)
	// 使用make定义切片 第一个参数表示类型，第二个参数表示长度
	var sli2 = make([]int,5)
	fmt.Println(sli2)
	myPrint(sli2)
	// 使用make定义切片，并定义容量
	var sli3 = make([]int,5,10)
	sli3 = []int{1,2,3,4,5,6,7,8,9,0,11}  // 发现切片可以被增加容量
	// sli3 = [][]int{    //这种方法是错误的；因为之前已经定义了sli3的类型
	// 	{1,2},
	// 	{3,4},
	// }
	myPrint(sli3)
	// 定义并初始化切片
	var sli4 = []int{0,9,8}
	// go的快捷方法
	sli5 := []int{5,6,7}
	myPrint(sli4)
	myPrint(sli5)
	// 切片的截取和数组一样
	myPrint(sli5[:2])

	// 如果定义的空切片；那么返回的就是 空 nil；在go语言中空就是nil
	var sli6 []int
	if sli6 == nil {
		fmt.Println("nil")
	}
	// 切片中的append 和copy函数，append就是向切片弹如一部分数据并返回一个新的切片；
	sli5 = append(sli5,2,4)
	myPrint(sli5)
	// copy(sli5,sli4)
	// myPrint(sli5)
	copy_sli := make([]int,len(sli5),cap(sli5)*2)
	copy(copy_sli,sli5)  // copy数组sli5到copy_sli中
	copy(copy_sli,sli4)
	fmt.Println(copy_sli)

	// 使用range遍历数组；会返回数组的索引和值；注意如果不想使用某一个返回值，需要使用 下划线 _ 站位
	for index,value := range copy_sli {
		fmt.Println(index,value)
	}
	// 忽略使用返回index索引的实例
	for _,value := range copy_sli {
		fmt.Println(value)
	}
	// 忽略使用返回value的实例
	for index,_ := range copy_sli {
		fmt.Println(index)
	}
}